package com.jv.test1;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

import java.util.Arrays;

/**
 * shiro有3种授权方式：
 * 1. 编程式
 * 2. 注解式：@RequiresRoles("管理员")
 * 3. 标签配置：<shiro:hasPermission name="add"><a>添加操作</a></shiro:hasPermission>
 *
 * 这里演示了shiro中如何编程式的，给身份认证通过的用户授予某些资源的访问权限。
 *
 */
public class TestA {

    public static void main(String[] args) {
        //[1]解析shiro.ini文件
        Factory<SecurityManager>  factory =new IniSecurityManagerFactory("classpath:shiro1.ini");

        //[2]通过SecurityManager工厂获得SecurityManager实例
        SecurityManager securityManager = factory.getInstance();

        //[3]把SecurityManager对象设置到运行环境中
        SecurityUtils.setSecurityManager(securityManager);

        //[4]通过SecurityUtils获得主体subject
        Subject subject = SecurityUtils.getSubject();

        //[5]书写自己输入的账号和密码---相当于用户自己输入的账号和密码
        //我们拿着自己书写用户名密码去和shiro.ini 文件中的账号密码比较
        UsernamePasswordToken  token =new UsernamePasswordToken("zs","123");

        try {
            //[6]进行身份的验证
            subject.login(token);

        } catch (IncorrectCredentialsException e) {
            System.out.println("登录失败");
        }

        //授权的查询

        /**********************
         **** 基于角色的授权 ****
         **********************/
        boolean flag = subject.hasRole("role1");
        //System.out.println(flag);

        //判断是否具有多个角色
        boolean[] booleans = subject.hasRoles(Arrays.asList("role1", "role3"));

        /*for(Boolean b:booleans){
            System.out.println(b);
        }*/
        //可以使用checkRole判断指定用户是否具有对应角色
        //如果指定用户下没有对应的角色就会抛出异常UnauthorizedException
       /* subject.checkRole("role3");

        subject.checkRoles("role1","role2");*/

        /**********************
         **** 基于资源的授权 ****
         **********************/
        //这里的资源其实是表示 addUser，updateUser等数据库操作
        boolean flag2 = subject.isPermitted("addUser");

        //判读是否具有多个资源
        boolean permittedAll = subject.isPermittedAll("addUser", "updateUser", "suibian");

        //通过checkPermission 进行判断指定用户下是否有指定的资源
        //如果没有就会抛出UnauthorizedException
        subject.checkPermission("suibian");

        subject.checkPermissions("suibian","addUser","updateUser");


    }
}
